using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Photos
{
    /// <summary>
    /// <para>GeoTagged Photos To Points</para>
    /// <para>Creates points from the x-, y-, and z-coordinates stored in geotagged photos. Optionally adds photo files to features in the output feature class as geodatabase attachments.</para>
    /// <para>根据存储在地理标记照片中的 x、y 和 z 坐标创建点。（可选）将照片文件作为地理数据库附件添加到输出要素类中的要素。</para>
    /// </summary>    
    [DisplayName("GeoTagged Photos To Points")]
    public class GeoTaggedPhotosToPoints : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public GeoTaggedPhotosToPoints()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_Input_Folder">
        /// <para>Input Folder</para>
        /// <para>The folder where photo files are located. This folder is scanned recursively for photo files; any photos in the base level of the folder, as well as in any subfolders, will be added to the output.</para>
        /// <para>照片文件所在的文件夹。以递归方式扫描此文件夹以查找照片文件;文件夹基本级别以及任何子文件夹中的任何照片都将添加到输出中。</para>
        /// </param>
        /// <param name="_Output_Feature_Class">
        /// <para>Output Feature Class</para>
        /// <para>The output point feature class.</para>
        /// <para>输出点要素类。</para>
        /// </param>
        public GeoTaggedPhotosToPoints(object _Input_Folder, object _Output_Feature_Class)
        {
            this._Input_Folder = _Input_Folder;
            this._Output_Feature_Class = _Output_Feature_Class;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "GeoTagged Photos To Points";

        public override string CallName => "management.GeoTaggedPhotosToPoints";

        public override List<string> AcceptEnvironments => ["outputZFlag", "scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_Input_Folder, _Output_Feature_Class, _Invalid_Photos_Table, _Include_Non_GeoTagged_Photos.GetGPValue(), _Add_Photos_As_Attachments.GetGPValue()];

        /// <summary>
        /// <para>Input Folder</para>
        /// <para>The folder where photo files are located. This folder is scanned recursively for photo files; any photos in the base level of the folder, as well as in any subfolders, will be added to the output.</para>
        /// <para>照片文件所在的文件夹。以递归方式扫描此文件夹以查找照片文件;文件夹基本级别以及任何子文件夹中的任何照片都将添加到输出中。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Folder")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _Input_Folder { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The output point feature class.</para>
        /// <para>输出点要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _Output_Feature_Class { get; set; }


        /// <summary>
        /// <para>Invalid Photos Table</para>
        /// <para><xdoc>
        ///   <para>The optional output table that will list any photo files in the input folder with invalid Exif metadata or empty or invalid coordinates.</para>
        ///   <para>If no path is specified, this table will not be created.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>可选的输出表，将列出输入文件夹中具有无效 Exif 元数据或空坐标或无效坐标的任何照片文件。</para>
        ///   <para>如果未指定路径，则不会创建此表。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Invalid Photos Table")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _Invalid_Photos_Table { get; set; } = null;


        /// <summary>
        /// <para>Include Non-GeoTagged Photos</para>
        /// <para><xdoc>
        ///   <para>Specifies if all photo files will be included in the output feature class or only those with valid coordinates.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—All photos will be added as records to the output feature class. If a photo file does not have coordinate information, it will be added as a feature with null geometry. This is the default.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Only photos with valid coordinate information will be included in the output feature class.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是将所有照片文件都包含在输出要素类中，还是仅包括具有有效坐标的照片文件。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 - 所有照片都将作为记录添加到输出要素类中。如果照片文件没有坐标信息，则该照片文件将添加为具有空几何的要素。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>未选中 - 输出要素类中将仅包含具有有效坐标信息的照片。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Include Non-GeoTagged Photos")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _Include_Non_GeoTagged_Photos_value _Include_Non_GeoTagged_Photos { get; set; } = _Include_Non_GeoTagged_Photos_value._true;

        public enum _Include_Non_GeoTagged_Photos_value
        {
            /// <summary>
            /// <para>ALL_PHOTOS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ALL_PHOTOS")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>ONLY_GEOTAGGED</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ONLY_GEOTAGGED")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Add Photos As Attachments</para>
        /// <para><xdoc>
        ///   <para>Specifies if the input photos will be added to the output as geodatabase attachments.</para>
        ///   <para>Adding attachments requires an ArcGIS Desktop Standard or higher license, and the output feature class must be in a version 10 or higher geodatabase.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—Photos will be added to the output features as geodatabase attachments copied internally to the geodatabase. This is the default.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Photos will not be added to the output features as geodatabase attachments.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否将输入照片作为地理数据库附件添加到输出中。</para>
        ///   <para>添加附件需要 ArcGIS Desktop Standard 或更高版本的许可，并且输出要素类必须位于版本 10 或更高版本的地理数据库中。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 - 照片将作为地理数据库附件添加到输出要素中，并在地理数据库内部复制。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>未选中 - 照片不会作为地理数据库附件添加到输出要素中。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Add Photos As Attachments")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _Add_Photos_As_Attachments_value _Add_Photos_As_Attachments { get; set; } = _Add_Photos_As_Attachments_value._true;

        public enum _Add_Photos_As_Attachments_value
        {
            /// <summary>
            /// <para>ADD_ATTACHMENTS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ADD_ATTACHMENTS")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_ATTACHMENTS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_ATTACHMENTS")]
            [GPEnumValue("false")]
            _false,

        }

        public GeoTaggedPhotosToPoints SetEnv(object outputZFlag = null, object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(outputZFlag: outputZFlag, scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}